package test.account;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;

import hyl.base.flow.Flow;
import hyl.base.flow.PoolFlow;
import hyl.base.flow.Track;
import hyl.base.flow.dao.HylFlowDao;
import hyl.core.Amy;
import hyl.core.MyDate;
import hyl.core.MyFun;

public class demo {
	private static final Logger log = LoggerFactory.getLogger(demo.class);

	public static void main(String[] ag) {
		demo d = new demo();
		d.test();
	}

	@Test
	public void test() {
		// 建表

		//FlowMysqlDao.createTables();

		// 新建 dao对象
		TradeDao fd = new TradeDao(Amy.getCommitDB1());
		// 初始化数据
		// 添加商品项目

		fd.insert商品("服装", "纯棉女装CHSSS1", 1, 1, new BigDecimal("0.1"), new BigDecimal("0.2"), new BigDecimal("0.3"),
				new BigDecimal("0.7"), new BigDecimal("0.8"), new BigDecimal("0.9"), new BigDecimal("10.1"),
				new BigDecimal("7.0"), new BigDecimal("6.0"), new BigDecimal("4.0"), "M", "cs001", "红", "件", "元", "中国台北",
				"img://xxxx", "促销款包邮");

		fd.insert商品("服装", "纯棉男装CHSSS2", 2, 1, new BigDecimal("0.1"), new BigDecimal("0.2"), new BigDecimal("0.3"),
				new BigDecimal("0.7"), new BigDecimal("0.8"), new BigDecimal("0.9"), new BigDecimal("11.4"),
				new BigDecimal("8.1"), new BigDecimal("6.0"), new BigDecimal("4.0"), "xxl", "nk002", "黑", "件", "元", "中国香港",
				"img://xxxxu", "促销款包邮");

		fd.insert商品("服装", "纯棉睡衣男款SSS1", 2, 1, new BigDecimal("0.1"), new BigDecimal("0.2"), new BigDecimal("0.3"),
				new BigDecimal("0.7"), new BigDecimal("0.8"), new BigDecimal("0.9"), new BigDecimal("12.3"),
				new BigDecimal("9.2"), new BigDecimal("6.0"), new BigDecimal("4.0"), "xxl", "nk003", "黑", "件", "元", "中国香港",
				"img://xxxxu", "促销款包邮");

		fd.insert商品("服装", "儿童内衣et1", 2, 1, new BigDecimal("0.1"), new BigDecimal("0.2"), new BigDecimal("0.3"),
				new BigDecimal("0.7"), new BigDecimal("0.8"), new BigDecimal("0.9"), new BigDecimal("19.3"),
				new BigDecimal("11.6"), new BigDecimal("6.0"), new BigDecimal("4.0"), "s", "nk005", "黑", "件", "元", "中国香港",
				"img://xxxxu", "促销款包邮");
		fd.commit();
		// 添加财务科目

		fd.insert科目("总账户", "", null);
		fd.insert科目("库存", "总账户", null);
		fd.insert科目("在途", "总账户", null);
		fd.insert科目("应收", "总账户", null);
		fd.insert科目("应付", "总账户", null);
		fd.insert科目("钱包", "总账户", null);
		fd.commit();

		// 建模型
		PoolFlow fp = PoolFlow.getInstance();
		Flow model = fp.getFlowModel("交易流程");
		// 初始化交易模型对象
		TradeFlow tf = new TradeFlow(model, fd);

		// 实例化一个新的工作流
		Track trk = tf.createTrack();

		String 甲方 = "邹老师";
		String 乙方 = "学生A";

		// BigDecimal 价格=new BigDecimal("9.3");
		Long 数量 = 10L;

		// 添加到购物车
		Object[] i = null;
		List<Object[]> 购物车明细编号 = new ArrayList<>();
		i = new Object[] { fd.insert购物车("纯棉女装CHSSS1", 甲方, 乙方, 数量, null, null) };
		购物车明细编号.add(i);
		i = new Object[] { fd.insert购物车("纯棉男装CHSSS2", 甲方, 乙方, 数量, null, null) };
		购物车明细编号.add(i);
		i = new Object[] { fd.insert购物车("儿童内衣et1", 甲方, 乙方, 数量, null, null) };
		购物车明细编号.add(i);
		fd.commit();

		// 插入订单
		tf.run乙方下订单(trk.flowid, 甲方, 甲方, 乙方, "下订单", 购物车明细编号);

		MyDate.sleep(2000);
		tf.run乙方付款(trk.flowid, 甲方, new BigDecimal("408"), "付款了");

		MyDate.sleep(2000);
		tf.run甲方发货(trk.flowid, 甲方, "发货地址南通xxx", MyFun.str2Date("2018-12-3"), "收货地址:北京xxx", new BigDecimal("6.0"), 30,
				"http://xxx.com/img.png  发货凭证", "备注");

		MyDate.sleep(2000);
		tf.run乙方签收(trk.flowid);

		MyDate.sleep(2000);

		// 正常流程
		// tf.run乙方确认付款(trk.flowid);
		// 退货( tf , trk) ;
		换货(tf, trk, 甲方);
		MyDate.sleep(2000);
		tf.run甲方归档(trk.flowid);
		// 查询购物车明细
		String msg = JSON.toJSONString(fd.select购物车(null));
		log.info(msg);

		// 查询订单明细
		msg = JSON.toJSONString(fd.select交易清单(null));
		log.info(msg);
		msg = JSON.toJSONString(fd.select账户(null));
		log.info(msg);
		msg = JSON.toJSONString(fd.select商品属性(null));
		log.info(msg);
		msg = JSON.toJSONString(fd.select购物车(null));
		log.info(msg);
		msg = JSON.toJSONString(fd.select交易环节(null));
		log.info(msg);
		msg = JSON.toJSONString(fd.select账本(null));
		log.info(msg);

		MyDate.sleep(4000);
	}

	public void 退货(TradeFlow tf, Track trk) {
		// 退货流程
		tf.run乙方退货(trk.flowid);
		MyDate.sleep(2000);
		tf.run甲方回收(trk.flowid);
		MyDate.sleep(2000);
		tf.run甲方退款(trk.flowid);
		MyDate.sleep(2000);
		tf.run乙方收款(trk.flowid);
	}

	public void 换货(TradeFlow tf, Track trk, String JF) {
		tf.run乙方退货(trk.flowid);
		MyDate.sleep(2000);
		tf.run甲方回收(trk.flowid);
		MyDate.sleep(2000);
		tf.run甲方发货(trk.flowid, JF, "发货地址南通xxx", MyFun.str2Date("2018-12-13"), "收货地址:北京xxx", new BigDecimal("6.0"), 30,
				"http://xxx.com/img.png  发货凭证", "备注");
		MyDate.sleep(2000);
		tf.run乙方签收(trk.flowid);
		MyDate.sleep(2000);
		tf.run乙方确认付款(trk.flowid);
	}
}
